package xstring

import (
	"strings"
	"time"
)

// 时间字符串转为时间
//
//	date	待转换的时间字符串，支持格式为([]内的为选填字符)：
//		[yy]yy-[m]m-[d]d hh:mm[:ss][.xxx]
//		[yy]yy-[m]m-[d]d
//		[yy]yy/[m]m-[d]d hh:mm[:ss][.xxx]
//		[yy]yy/[m]m-[d]d
//		[yy]yy/[m]m/[d]d hh:mm[:ss][.xxx]
//		[yy]yy/[m]m/[d]d
//		[yy]yy-[m]m/[d]d hh:mm[:ss][.xxx]
//		[yy]yy-[m]m/[d]d
//		[m]m-[d]d-[yy]yy hh:mm[:ss][.xxx]
//		[m]m-[d]d-[yy]yy
//		[m]m-[d]d/[yy]yy hh:mm[:ss][.xxx]
//		[m]m-[d]d/[yy]yy
//		[m]m/[d]d/[yy]yy hh:mm[:ss][.xxx]
//		[m]m/[d]d/[yy]yy
//		[m]m/[d]d-[yy]yy hh:mm[:ss][.xxx]
//		[m]m/[d]d-[yy]yy
//		yyyy-mm-ddThh:mm:ss[.xxx][+/-mm:ss]
func ToTime(date string) *time.Time {
	// 日期处理
	if len(date) < 5 {
		return &time.Time{}
	}
	param := ""
	// 判断传入的时间格式
	if strings.ContainsAny(date, "T") {
		// 传入的时间是默认的2019-04-13T19:37:18.335861295+08:00格式
		param = time.RFC3339
		if strings.ContainsAny(date, ".") {
			// 存在浮点数，即格式中存在微妙、毫秒等信息
			param = time.RFC3339Nano
		}
	} else {
		date = strings.ReplaceAll(date, "/", "-")
		// 正常的2023-12-01 10:35:01格式时间
		// 如果是使用/分割的字符串
		lis := strings.Split(date, "-")
		if len(lis) != 3 {
			// 如果其中的/不等于2个，直接返回失败信息
			return &time.Time{}
		}
		// param = time.DateOnly
		if ToInt(lis[0]) >= 13 && ToInt(lis[0]) < 1000 {
			// 如果是两位数的年
			param += "06-"
			// 判断月份是否有前导0
			if lis[1][0] == '0' {
				param += "02-"
			} else {
				param += "2-"
			}
			// 判断日是否有前导0
			if lis[2][0] == '0' {
				param += "03"
			} else {
				param += "3"
			}
		} else if ToInt(lis[0]) < 13 {
			// 月份的前导0
			if lis[0][0] == '0' {
				param += "01-"
			} else {
				param += "1-"
			}
			// 日期的前导0
			if lis[1][0] == '0' {
				param += "02-"
			} else {
				param += "2-"
			}
			// 第一位是月，则第三位为年，确定年的格式
			years := strings.Split(lis[2], " ")
			if ToInt(years[0]) > 1000 {
				param += "2006"
			} else {
				param += "06"
			}
		}
		if strings.ContainsAny(date, " ") {
			// 如果存在空格，则表示存在时间格式
			switch len(strings.Split(date, ":")) {
			case 2:
				// 存在一个:
				param += " 15:04"
			case 3:
				// 存在两个:
				param += " 15:04:05"
			}
		}
		if strings.ContainsAny(date, ".") {
			// 存在小数点
			param += ".999999999"
		}
	}
	// 如果之间有空格，且空格不在第一位
	s1, err := time.ParseInLocation(param, date, time.Local)
	if err != nil {
		return &time.Time{}
	}
	return &s1
}
